]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
screencastService: Signal errors via the internal dbus interface
authorJonas Dreßler <verdre@v0yd.nl>
Wed, 26 Apr 2023 10:29:57 +0000 (12:29 +0200)
committerJonas Dreßler <verdre@v0yd.nl>
Wed, 26 Apr 2023 11:35:57 +0000 (13:35 +0200)
Make sure gnome-shell gets notified of errors that happen during screen
recording using the screencastService, so that it can properly notify the
user about the error and tear down its state, too.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2752>

data/dbus-interfaces/org.gnome.Shell.Screencast.xml
js/dbusServices/org.gnome.Shell.Screencast.src.gresource.xml
js/dbusServices/screencast/screencastService.js

index b4cd592ab1299745f26daed70e382002a5803cc9..6512396d94674822f36e055e60f790b72ae9a086 100644 (file)
@@ -92,5 +92,9 @@
       <arg type="b" direction="out" name="success"/>
     </method>
 
+    <signal name="Error">
+      <arg type="s" name="message"/>
+    </signal>
+
   </interface>
 </node>
index 292f0f1608c71a5864951024a52323f4b35dc805..a247050e3af185089a3bb90a017db06ec2e9591a 100644 (file)
@@ -7,5 +7,7 @@
 
     <file>misc/config.js</file>
     <file>misc/dbusUtils.js</file>
+    <file>misc/signals.js</file>
+    <file>misc/signalTracker.js</file>
   </gresource>
 </gresources>
index 3183a0093db842ad3783770ef51cd24d91d2686d..37327e24c6668468898ca57d6cb18786d09945c0 100644 (file)
@@ -7,6 +7,7 @@ imports.gi.versions.Gtk = '4.0';
 const { Gio, GLib, Gst, Gtk } = imports.gi;
 
 const { loadInterfaceXML, loadSubInterfaceXML } = imports.misc.dbusUtils;
+const Signals = imports.misc.signals;
 const { ServiceImplementation } = imports.dbusService;
 
 const ScreencastIface = loadInterfaceXML('org.gnome.Shell.Screencast');
@@ -54,13 +55,13 @@ const SessionState = {
     STOPPED: 'STOPPED',
 };
 
-var Recorder = class {
+var Recorder = class extends Signals.EventEmitter {
     constructor(sessionPath, x, y, width, height, filePath, options,
-        invocation,
-        onErrorCallback) {
+        invocation) {
+        super();
+
         this._startInvocation = invocation;
         this._dbusConnection = invocation.get_connection();
-        this._onErrorCallback = onErrorCallback;
         this._stopInvocation = null;
 
         this._x = x;
@@ -147,11 +148,6 @@ var Recorder = class {
 
         log(`Recorder error: ${error.message}`);
 
-        if (this._onErrorCallback) {
-            this._onErrorCallback();
-            delete this._onErrorCallback;
-        }
-
         if (this._startRequest) {
             this._startRequest.reject(error);
             delete this._startRequest;
@@ -161,6 +157,8 @@ var Recorder = class {
             this._stopRequest.reject(error);
             delete this._stopRequest;
         }
+
+        this.emit('error', error);
     }
 
     _handleFatalPipelineError(message) {
@@ -529,8 +527,7 @@ var ScreencastService = class extends ServiceImplementation {
                 screenWidth, screenHeight,
                 filePath,
                 options,
-                invocation,
-                () => this._removeRecorder(sender));
+                invocation);
         } catch (error) {
             log(`Failed to create recorder: ${error.message}`);
             invocation.return_value(GLib.Variant.new('(bs)', returnValue));
@@ -548,6 +545,12 @@ var ScreencastService = class extends ServiceImplementation {
         } finally {
             invocation.return_value(GLib.Variant.new('(bs)', returnValue));
         }
+
+        recorder.connect('error', (r, error) => {
+            this._removeRecorder(sender);
+            this._dbusImpl.emit_signal('Error',
+                new GLib.Variant('(s)', [error.message]));
+        });
     }
 
     async ScreencastAreaAsync(params, invocation) {
@@ -579,8 +582,7 @@ var ScreencastService = class extends ServiceImplementation {
                 width, height,
                 filePath,
                 options,
-                invocation,
-                () => this._removeRecorder(sender));
+                invocation);
         } catch (error) {
             log(`Failed to create recorder: ${error.message}`);
             invocation.return_value(GLib.Variant.new('(bs)', returnValue));
@@ -598,6 +600,12 @@ var ScreencastService = class extends ServiceImplementation {
         } finally {
             invocation.return_value(GLib.Variant.new('(bs)', returnValue));
         }
+
+        recorder.connect('error', (r, error) => {
+            this._removeRecorder(sender);
+            this._dbusImpl.emit_signal('Error',
+                new GLib.Variant('(s)', [error.message]));
+        });
     }
 
     async StopScreencastAsync(params, invocation) {